home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 3 / The Arsenal Files 3.iso / gen_prog / appdemo.exe / API.APP next >
Text File  |  1994-11-07  |  9KB  |  382 lines

  1. //                              API LIBRARY
  2. //                              ===========
  3.  
  4. // This file contains the library of functions for a pleasing
  5. // "Applications Program Interface".
  6.  
  7. // You can modify it to suit your particular needs.  If you
  8. // do then it would be a good idea to lable all your changes with a unique
  9. // string in a comment so that if you get an upgrade you can remake those
  10. // changes.
  11.  
  12. // Output from this API library cannot be redirected
  13.  
  14. // Output using this API is a lot faster than normal DOS calls
  15. // because it accesses screen memory directly.
  16.  
  17. #define API   // Make some modifications to MAINLIB.APP
  18.  
  19. // These are the colors available
  20. // To use a background color greater than 7 make sure that you first
  21. // call TextBlinkOff()
  22.  
  23. #define BLACK      0
  24. #define BLUE       1
  25. #define GREEN      2
  26. #define CYAN       3
  27. #define RED        4
  28. #define MAGENTA    5
  29. #define BROWN      6
  30. #define WHITE      7
  31. #define GREY       8
  32. #define LIGHTBLUE  9
  33. #define LIGHTGREEN 10
  34. #define LIGHTCYAN  11
  35. #define LIGHTRED       12
  36. #define LIGHTMAGENTA   13
  37. #define YELLOW         14
  38. #define BRILLIANTWHITE 15
  39.  
  40. void Vdu()
  41. {
  42.  // This function is to group data together like a "struct" command but faster
  43.  byte Page;
  44.  byte BackgroundColor;
  45.  byte ForegroundColor;
  46.  byte Blink;
  47.  byte Attribute;
  48.  byte CursorOn;
  49.  int  OldCursorShape;
  50.  byte Row;
  51.  byte Column;
  52.  
  53.  // Screen border
  54.  byte MinCol;
  55.  byte MinRow;
  56.  byte MaxCol;
  57.  byte MaxRow;
  58. }
  59.  
  60.  
  61. void SetVideoMode(AL_VideoMode)
  62. {
  63.  // Sets the Video Mode for the screen.
  64.  
  65.  // 0 = 40 * 25    2  Color, CGA,EGA,MCGA,VGA
  66.  // 1 = 40 * 25    16 Color, CGA,EGA,MCGA,VGA
  67.  // 2 = 80 * 40    2  Color, CGA,EGA,MCGA,VGA
  68.  // 3 = 80 * 40    16 Color, CGA,EGA,MCGA,VGA
  69.  // 4 = 320 * 200  4 Color Graphics
  70.  // 5 = 320 * 200  4 Color Graphics, Color Burst Disabled
  71.  // 6 = 640 * 200  2 Color Graphics
  72.  // 7 = 80 * 25    Mono, MDA,EGA,VGA
  73.  // 8,9,10         PCjr only
  74.  // 11,12          Used internally by EGA BIOS - Do not use ***
  75.  // 13 = 320 * 200 16 Color, EGA,VGA
  76.  // 14 = 640 * 200 16 Color, EGA,VGA
  77.  // 15 = 640 * 350 Mono, EGA,VGA
  78.  // 16 = 640 * 350 16 Color, EGA,VGA
  79.  // 17 = 640 * 480 2 Color, MCGA,VGA
  80.  // 18 = 640 * 480 16 Color, VGA
  81.  // 19 = 320 * 200 256 Color, MCGA,VGA
  82.  
  83.  if(AL_VideoMode > 7 && AL_VideoMode < 13) End(31); // Prevent Modes 8 - 12 from being used.
  84.  AH=00h; INT 10h;
  85. }
  86.  
  87.  
  88. byte GetVideoMode()
  89. {
  90.  // Returns a byte containing the Current Video Mode
  91.  
  92.  AH = 0Fh; INT 10h;
  93.  return AL;   // Returns the video mode to the calling function.
  94. }
  95.  
  96.  
  97. void ClearScreen()
  98. {
  99.  // Clears the current video screen to be blank.
  100.  byte MouseWasVisible;
  101.  preserve DI, DX, ES;
  102.  
  103.  Vdu.Attribute = ( Vdu.ForegroundColor + Vdu.BackgroundColor << 4 ) | Vdu.Blink;
  104.  CL = Vdu.MinCol;
  105.  CH = Vdu.MinRow;
  106.  DL = Vdu.MaxCol;
  107.  DH = Vdu.MaxRow;
  108.  BH = Vdu.Attribute;
  109.  if(Mouse.Visible)
  110.  {
  111.   HideMouse();
  112.   AX = 0600h; INT 10h; // BIOS scroll up by 0 (Clear screen)
  113.   ShowMouse();
  114.  }
  115.  else { AX = 0600h; INT 10h; } // BIOS scroll up by 0 (Clear Screen)
  116.  
  117.  Vdu.Column = Vdu.MinCol;
  118.  Vdu.Row    = Vdu.MinRow;
  119.  Stream.ColumnNumber[cout] = 0;
  120.  Stream.ColumnNumber[cerr] = 0;
  121.  
  122.  /*
  123.  if(Mouse.Visible) { MouseWasVisible = Mouse.Visible; HideMouse(); }
  124.  AL = Vdu.Page; AH = 0; AX = AX * 100h + B800h; ES = AX; // Page address
  125.  Vdu.Attribute = ( Vdu.ForegroundColor + Vdu.BackgroundColor << 4 ) | Vdu.Blink;
  126.  for(DI=0; DI<4000; DI=DI+2) { E1[DI] = ' '; E1[DI+1] = Vdu.Attribute; }
  127.  Vdu.Column = 0;
  128.  Vdu.Row = 0;
  129.  Stream.ColumnNumber[cout] = 0;
  130.  Stream.ColumnNumber[cerr] = 0;
  131.  if(MouseWasVisible) ShowMouse();
  132.  */
  133. }
  134.  
  135.  
  136. void ClearLine()
  137. {
  138.  preserve DI, SI, ES;
  139.  
  140.  Vdu.Attribute = ( Vdu.ForegroundColor + Vdu.BackgroundColor << 4 ) | Vdu.Blink;
  141.  AL = Vdu.Page; AH = 0; AX = AX * 100h + B800h; ES = AX; // Page address
  142.  
  143.  // Calculate the character position on the screen
  144.  AL = Vdu.Column; AH = 0;
  145.  DI = AX;
  146.  AL = Vdu.Row;
  147.  DI = (DI + AX * 80) * 2;
  148.  
  149.  // Write the blank characters
  150.  AL = Vdu.Column; AH = 0; SI_Column = AX;
  151.  while(SI_Column < 80) { E1[DI++] = ' '; E1[DI++] = Vdu.Attribute; SI++; }
  152. }
  153.  
  154.  
  155.  
  156. void CursorOff()
  157. {
  158.  DX = FFFFh; BH = Vdu.Page; AH = 02h; INT 10h; // Place BIOS cursor off page
  159.  Vdu.CursorOn = 0; 
  160. }
  161.  
  162.  
  163. void CursorOn()
  164. {
  165.  DH = Vdu.Row; DL = Vdu.Column; BH = Vdu.Page; AH = 02h; INT 10h; // Place BIOS cursor off page
  166.  Vdu.CursorOn = 1; 
  167. }
  168.  
  169.  
  170. void SetBorderColor(BH_Color)
  171.  // This function sets the screen border color.
  172.  
  173.  AL=01h; AH=10h; INT 10h;
  174. }
  175.  
  176.  
  177. byte GetPaletteColor(BL_PaletteRegister)
  178.  // This function returns the number of the color loaded into the specified
  179.  // palette register. Set the Palette function to load a new color into
  180.  // the color register.
  181.  int ColorOut;
  182.  
  183.  AL=07h; AH=10h; INT 10h;
  184.  return BH_PaletteColor;
  185. }
  186.  
  187.  
  188. void GetCursorPosition()
  189. {
  190.  // This function returns the current cursor postion.
  191.  byte Row;
  192.  byte Column;
  193.  byte VideoPage;
  194.  preserve DX;
  195.  
  196.  AH=03h; INT 10h;
  197.  VideoPage = BH;
  198.  Row = DH;
  199.  Column = DL;
  200. }
  201.  
  202.  
  203. void SetCursorPosition(AL_Column,AH_Row,BH_VideoPage)
  204. {
  205.  // This function sets the cursor postion on the computers screen.
  206.  byte Row;
  207.  byte Column;
  208.  preserve DX;
  209.  
  210.  DX=AX;             // Copy AL and AH to DL and DH
  211.  AH=02h; INT 10h;   // Call Interrupt 10 Hex
  212. }
  213.  
  214.  
  215. void Palette(BL_PaletteRegister,BH_PaletteColor)
  216. {
  217.  preserve ALL;
  218.  AL=00h; AH=10h; INT 10h;
  219. }
  220.  
  221.  
  222. void SetDisplayPage(AL_PageNumber)
  223. {
  224.  // This function sets the active video display page for the text and 
  225.  // graphics screens. NOTE if you you this function on a CGA screen pages
  226.  // 4-7 overlap pages 0-3 as CGA can only display 4 pages of text.
  227.  // In all modes page 0 is the default page.
  228.  
  229.  AH=05h; INT 10h;
  230. }
  231.  
  232.  
  233. void TextBlinkOff()
  234. {
  235.  // This function turns off the effect of blinking or flashing text on
  236.  // your screen or monitor. The advantage of doing this is with the 
  237.  // text blink turned off you have access to 16 background colors instead
  238.  // of 8 backgroud colors. See function TextBlinkOn to reverse this effect.
  239.  // NOTE text blink is turned on by default.
  240.  
  241.  BL=00h; AL=03h; AH=10h; INT 10h;
  242. }
  243.  
  244.  
  245. void TextBlinkOn()
  246. {
  247.  // This function turns on the effect of blinking or flashing text on
  248.  // your screen or monitor. The disadvantage of doing this is with the 
  249.  // text blink turned on is that you have access to 8 background colors 
  250.  // instead of 16 backgroud colors. See function TextBlinkOff to reverse 
  251.  // this effect.
  252.  // NOTE text blink is turned on by default.
  253.  
  254.  BL=01h; AL=03h; AH=10h; INT 10h;
  255. }
  256.  
  257.  
  258. void ScrollWindowUp(CL_TopLeftColumn, CH_TopLeftRow, AL_BottomRightColumn, AH_BottomRightRow)
  259. {
  260.  preserve DX;
  261.  
  262.  DX = AX;
  263.  Vdu.Attribute = ( Vdu.ForegroundColor + Vdu.BackgroundColor << 4 ) | Vdu.Blink;
  264.  BH = Vdu.Attribute.
  265.  AX = 0601h; 
  266.  if(Mouse.Visible)
  267.  {
  268.   HideMouse();
  269.   INT 10h;
  270.   ShowMouse();
  271.  }
  272.  else INT 10h;
  273. }
  274.  
  275.  
  276. void DrawBox(byte TopLeftColumn, byte TopLeftRow, byte BottomRightColumn, byte BottomRightRow)
  277. {
  278.  byte MouseWasVisible;
  279.  preserve DX, SI, DI;
  280.  
  281.  if(Mouse.Visible) { MouseWasVisible = Mouse.Visible; HideMouse(); }
  282.  Vdu.Column = TopLeftColumn;
  283.  Vdu.Row = TopLeftRow;
  284.  cout << "┌";
  285.  for(DL=TopLeftColumn+1; DL<BottomRightColumn; DL++) cout << "─";
  286.  cout << "┐";
  287.  for(DL=TopLeftRow+1; DL<BottomRightRow; DL++)
  288.  {
  289.   Vdu.Row    = DL;
  290.   Vdu.Column = TopLeftColumn;      cout << "│";
  291.   AL_Count = BottomRightColumn - TopLeftColumn - 1; AH = 0; SI_Count = AX;
  292.   for(DI=0; DI<SI_Count; DI++) cout << " ";
  293.   Vdu.Column = BottomRightColumn;  cout << "│";
  294.  }
  295.  Vdu.Column = TopLeftColumn;
  296.  Vdu.Row = BottomRightRow;
  297.  cout << "└";
  298.  for(DL=TopLeftColumn+1; DL<BottomRightColumn; DL++) cout << "─";
  299.  cout << "┘";
  300.  Vdu.Column = TopLeftColumn + 1;
  301.  Vdu.Row = TopLeftRow + 1;
  302.  if(MouseWasVisible) ShowMouse();
  303. }
  304.  
  305.  
  306. // MOUSE FUNCTIONS
  307. // ===============
  308.  
  309. void Mouse()
  310. {
  311.  // This function is to group data together like a "struct" command but faster
  312.  byte Active;
  313.  byte Visible;
  314.  byte Row;
  315.  byte Col;
  316.  byte LeftButtonDown;
  317.  byte RightButtonDown;
  318.  byte CentreButtonDown;
  319. }
  320.  
  321.  
  322. byte InitialiseMouse()
  323. {
  324.  // This must be called before using the mouse
  325.  // It resets the Hardware and Software.  It can take a while to reset
  326.  // the mouse, so you may wish to display "Initialising Mouse" while
  327.  // it is doing so.
  328.  
  329.  AX = 0000h; INT 33h;      // Initialise Mouse
  330.  Mouse.Active = AH & 1;    // Only look at first bit
  331.  if(Mouse.Active)
  332.  {
  333.   ShowMouse();             // Show Mouse
  334.   UpdateMouseVariables();  // Initialise Mouse Variables
  335.  }
  336.  return Mouse.Active;      // Returns TRUE if mouse is installed else FALSE
  337. }
  338.  
  339.  
  340. void HideMouse()
  341. {
  342.  // Note that the library functions call HideMouse() before writing to the 
  343.  // screen and then call ShowMouse() again.
  344.  // This is to prevent "Mouse Droppings"
  345.  preserve AX;
  346.  
  347.  AX = 0002h; INT 33h; // Hide Mouse Cursor
  348.  Mouse.Visible = FALSE;
  349. }
  350.  
  351.  
  352. void ShowMouse()
  353. {
  354.  preserve AX;
  355.  
  356.  //if(Mouse.Active)
  357.  //{
  358.   AX = 0001h; INT 33h;  // Show Mouse Cursor
  359.  //}
  360.  Mouse.Visible = TRUE;
  361. }
  362.  
  363.  
  364. void UpdateMouseVariables()   
  365. {
  366.  // Update the Mouse variables
  367.  preserve DX;
  368.  
  369.  //if(Mouse.Active)
  370.  //{
  371.   AX = 0003h; INT 33h; // Get Mouse Position
  372.   CX = CX >> 3; Mouse.Col = CL;
  373.   DX = DX >> 3; Mouse.Row = DL;
  374.   Mouse.LeftButtonDown   = BL & 1;  BL = BL >> 1;
  375.   Mouse.RightButtonDown  = BL & 1;  BL = BL >> 1;
  376.   Mouse.CentreButtonDown = BL & 1;
  377.  //}
  378. }
  379.  
  380.